package com.qst.order.config;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 接口响应时间采集拦截器：拦截所有API请求，记录真实耗时
 */
@Component
public class ApiResponseTimeInterceptor implements HandlerInterceptor {
    // 注入JdbcTemplate，用于存储原始数据
    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 记录请求开始时间（ThreadLocal避免多线程共享问题）
    private final ThreadLocal<Long> requestStartTime = new ThreadLocal<>();

    // 1. 请求开始前：记录时间戳（毫秒）
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 排除不需要监控的接口（如健康检查、静态资源）
        String requestUri = request.getRequestURI();
        if (requestUri.startsWith("/api/user/login") || requestUri.startsWith("/api/user/register")) {
            return true; // 不拦截这些接口
        }
        // 记录请求开始时间
        requestStartTime.set(System.currentTimeMillis());
        return true;
    }

    // 2. 响应完成后：计算耗时并存入数据库
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 获取请求开始时间（若为排除的接口，直接返回）
        Long startTime = requestStartTime.get();
        if (startTime == null) {
            return;
        }
        // 计算响应时间（毫秒）
        long responseTime = System.currentTimeMillis() - startTime;
        // 获取接口URL、请求状态（成功=1，失败=0）
        String interfaceUrl = request.getRequestURI();
        int status = (ex == null && response.getStatus() == 200) ? 1 : 0;
        // 格式化请求时间（精确到秒，对应表中 request_time 字段）
        String requestTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        // 插入原始数据表（实时存储单条请求数据）
        String sql = "INSERT INTO api_response_time_raw " +
                "(interface_url, response_time, request_time, status) " +
                "VALUES (?, ?, ?, ?)";
        jdbcTemplate.update(sql, interfaceUrl, responseTime, requestTime, status);

        // 清除ThreadLocal，避免内存泄漏
        requestStartTime.remove();
    }
}